[[ ~ ]] 論理演算子
条件 | 説明 |
---|---|
EXPRESSION | EXPRESSION が true |
! EXPRESSION | EXPRESSION が false |
EXPRESSION1 && EXPRESSION2 | EXPRESSION1 と EXPRESSION2 がどちらも true |
EXPRESSION1 || EXPRESSION2 | EXPRESSION1 か EXPRESSION2 のどちらか true |
echo '評価結果が true の場合は終了ステータスが 0'
[[ ok ]]
echo "[[ ok ]] : \$?=$?"
[[ '' ]]
echo "[[ '' ]] : \$?=$?"
[[ ! ok ]]
echo "[[ ! ok ]] : \$?=$?"
[[ ! '' ]]
echo "[[ ! '' ]] : \$?=$?"
test コマンドは AND 条件は -a 、OR 条件は -o で記述しますが、複合コマンドの [[ を使用する場合は AND 条件を && 、OR 条件を || で記述します
[[ ok && ok ]]
echo "[[ ok && ok ]] : \$?=$?"
[[ ok && '' ]]
echo "[[ ok && '' ]] : \$?=$?"
[[ '' && ok ]]
echo "[[ '' && ok ]] : \$?=$?"
[[ '' && '' ]]
echo "[[ '' && '' ]] : \$?=$?"
&& は 左の結果が false と評価された場合は右を評価しません(短絡評価)
# 左の結果が false と評価されるので、右は評価されない
# 標準エラーには L のみが出力される
[[ "$(echo L | tee -a /dev/stderr)" != L && "$(echo R | tee -a /dev/stderr)" ]]
# 左の結果が true と評価されるので、右も実行される
# 標準エラーには L と R が出力される
[[ "$(echo L | tee -a /dev/stderr)" == L && "$(echo R | tee -a /dev/stderr)" ]]
[[ ok || ok ]]
echo "[[ ok || ok ]] : \$?=$?"
[[ ok || '' ]]
echo "[[ ok || '' ]] : \$?=$?"
[[ '' || ok ]]
echo "[[ '' || ok ]] : \$?=$?"
[[ '' || '' ]]
echo "[[ '' || '' ]] : \$?=$?"
|| は 左の結果が true と評価された場合は右を評価しません(短絡評価)
# 左の結果が true と評価されるので、右は評価されない
# 標準エラーには L のみが出力される
[[ "$(echo L | tee -a /dev/stderr)" == L || "$(echo R | tee -a /dev/stderr)" ]]
# 左の結果が false と評価されるので、右も実行される
# 標準エラーには L と R が出力される
[[ "$(echo L | tee -a /dev/stderr)" != L || "$(echo R | tee -a /dev/stderr)" ]]
[[ ~ ]] 文字列の演算子
条件 | 説明 |
---|---|
-n STRING | STRING の文字数が 0 ではない |
-z STRING | STRING の文字数が 0 である |
STRING1 = STRING2 | STRING1 と STRING2 が等しい( == と同じ) |
STRING1 == STRING2 | STRING1 と STRING2 が等しい( = と同じ) |
STRING1 != STRING2 | STRING1 と STRING2 が等しくない |
STRING1 < STRING2 | STRING1 が STRING2 より辞書順で前にある |
STRING1 > STRING2 | STRING1 が STRING2 より辞書順で後にある |
[[ -n '' ]]
echo "[[ -n '' ]] : \$?=$?"
[[ -n ok ]]
echo "[[ -n ok ]] : \$?=$?"
[[ -z '' ]]
echo "[[ -z '' ]] : \$?=$?"
[[ -z ok ]]
echo "[[ -z ok ]] : \$?=$?"
[[ '' = '' ]]
echo "[[ '' = '' ]] : \$?=$?"
[[ '' = ok ]]
echo "[[ '' = ok ]] : \$?=$?"
[[ '' = 'ok' ]]
echo "[[ '' = 'ok' ]] : \$?=$?"
[[ ok = ok ]]
echo "[[ ok = ok ]] : \$?=$?"
[[ '' == '' ]]
echo "[[ '' == '' ]] : \$?=$?"
[[ '' == ok ]]
echo "[[ '' == ok ]] : \$?=$?"
[[ '' == 'ok' ]]
echo "[[ '' == 'ok' ]] : \$?=$?"
[[ ok == ok ]]
echo "[[ ok == ok ]] : \$?=$?"
[[ '' != '' ]]
echo "[[ '' != '' ]] : \$?=$?"
[[ '' != ok ]]
echo "[[ '' != ok ]] : \$?=$?"
[[ '' != 'ok' ]]
echo "[[ '' != 'ok' ]] : \$?=$?"
[[ ok != ok ]]
echo "[[ ok != ok ]] : \$?=$?"
test コマンドの場合は < や > はエスケープする必要がありましたが、複合コマンド [[ の場合はその必要がありません
[[ A < B ]]
echo "[[ A < B ]] : \$?=$?"
[[ B < A ]]
echo "[[ B < A ]] : \$?=$?"
[[ A < A ]]
echo "[[ A < A ]] : \$?=$?"
[[ \' < '' ]]
echo "[[ \' < '' ]] : \$?=$?"
[[ \' < A ]]
echo "[[ \' < A ]] : \$?=$?"
[[ A > B ]]
echo "[[ A > B ]] : \$?=$?"
[[ B > A ]]
echo "[[ B > A ]] : \$?=$?"
[[ A > A ]]
echo "[[ A > A ]] : \$?=$?"
[[ \' > '' ]]
echo "[[ \' > '' ]] : \$?=$?"
[[ \' > A ]]
echo "[[ \' > A ]] : \$?=$?"
[[ ~ ]] 数値の演算子
複合コマンド [[ でも test コマンドで使用できる数値の演算子が利用できます。
条件 | 不等号 | 説明 |
---|---|---|
INTEGER1 -eq INTEGER2 | == | INTEGER1 と INTEGER2 が等しい |
INTEGER1 -ge INTEGER2 | >= | INTEGER1 は INTEGER2 以上 |
INTEGER1 -gt INTEGER2 | > | INTEGER1 は INTEGER2 より大きい |
INTEGER1 -le INTEGER2 | <= | INTEGER1 は INTEGER2 以下 |
INTEGER1 -lt INTEGER2 | < | INTEGER1 は INTEGER2 より小さい |
INTEGER1 -ne INTEGER2 | != | INTEGER1 と INTEGER2 は等しくない |
[[ 1 -eq 1 ]]
echo "[[ 1 -eq 1 ]] : \$?=$?"
[[ 1 -eq 0 ]]
echo "[[ 1 -eq 0 ]]: \$?=$?"
[[ 1 -ge -1 ]]
echo "[[ 1 -ge -1 ]] : \$?=$?"
[[ 1 -ge 0 ]]
echo "[[ 1 -ge 0 ]] : \$?=$?"
[[ 1 -ge 1 ]]
echo "[[ 1 -ge 1 ]] : \$?=$?"
[[ 1 -ge 2 ]]
echo "[[ 1 -ge 2 ]] : \$?=$?"
[[ 1 -gt -1 ]]
echo "[[ 1 -gt -1 ]] : \$?=$?"
[[ 1 -gt 0 ]]
echo "[[ 1 -gt 0 ]] : \$?=$?"
[[ 1 -gt 1 ]]
echo "[[ 1 -gt 1 ]] : \$?=$?"
[[ 1 -gt 2 ]]
echo "[[ 1 -gt 2 ]] : \$?=$?"
[[ 1 -le -1 ]]
echo "[[ 1 -le -1 ]] : \$?=$?"
[[ 1 -le 0 ]]
echo "[[ 1 -le 0 ]] : \$?=$?"
[[ 1 -le 1 ]]
echo "[[ 1 -le 1 ]] : \$?=$?"
[[ 1 -le 2 ]]
echo "[[ 1 -le 2 ]] : \$?=$?"
[[ 1 -lt -1 ]]
echo "[[ 1 -lt -1 ]] : \$?=$?"
[[ 1 -lt 0 ]]
echo "[[ 1 -lt 0 ]] : \$?=$?"
[[ 1 -lt 1 ]]
echo "[[ 1 -lt 1 ]] : \$?=$?"
[[ 1 -lt 2 ]]
echo "[[ 1 -lt 2 ]] : \$?=$?"
[[ 1 -ne 1 ]]
echo "[[ 1 -ne 1 ]] : \$?=$?"
[[ 1 -ne 0 ]]
echo "[[ 1 -ne 0 ]] : \$?=$?"
[[ ~ ]] シェルオプション・シェル変数のチェック
条件 | 説明 |
---|---|
-o OPTNAME | OPTNAME のシェルオプションが有効になっている |
-v VARNAME | VARNAME のシェル変数が定義されている |
set -o noglob +o pipefail
shopt -o | grep -E '^(noglob|pipefail)'
echo '------------------------------'
[[ -o noglob ]]
echo "[[ -o noglob ]] : \$?=$?"
[[ -o pipefail ]]
echo "[[ -o pipefail ]] : \$?=$?"
var1=
# シェル変数 var1 は定義されているが var2 は定義されていない
[[ -v var1 ]]
echo "[[ -v var1 ]] : \$?=$?"
[[ -v var2 ]]
echo "[[ -v var2 ]] : \$?=$?"